/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb.common;

import applicationexcepcion.OrdineStateException;
import common.ProdottoQuantita;
import common.StatoOrdine;
import entity.Cliente;
import entity.Negozio;
import entity.Ordine;
import facade.NegozioFacade;
import facade.OrdineFacade;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Antonio
 */
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class OrdineManager implements OrdineManagerLocal {

    @EJB
    private NegozioFacade negozioFacade;
    @PersistenceContext(unitName = "E-Market-ejbPU")
    private EntityManager em;

    public void persist(Object object) {
        em.persist(object);
    }
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @EJB
    private OrdineFacade ordineFacade;
//    @EJB
//    private NegozioManager negozioManager;
//    @EJB
//    private ClienteManager clienteManager;
    private StatoOrdine stato;

    @Override
    public void creaOrdine(Ordine ordine) {
        ordineFacade.create(ordine);
    }// creaOrdine

    public void persist1(Object object) {
        em.persist(object);
    }

    @Override
    public void rimuoviOrdine(Ordine ordine) {

        if (ordine == null) {

            return;
        }

        Query q = em.createNamedQuery("ordine.cercaPerId");
        q.setParameter(1, ordine.getId());
        if (!q.getResultList().isEmpty()) {

            return;
        }
        ordineFacade.remove(ordine);

    }// rimuoviOrdine

    @Override
    public List<Negozio> cercaOrdinePerNegozio(Long idNegozio) {

//        Query q = em.createNamedQuery("ordine.cercaPerIdNegozio");
//        q.setParameter(1, negozioManager.cercaNegozio(idNegozio));
//        if (!q.getResultList().isEmpty()) {
//
//            return null;
//        }
//        return q.getResultList();
        return null;
    }// cercaOrdinePerNegozio

    @Override
    public void creaOrdine(List<ProdottoQuantita> listaProdotti) {
    }// creaOrdine

    @Override
    public List<Cliente> cercaOrdinePerCliente(Long idCliente) {

//        Query q = em.createNamedQuery("ordine.cercaPerIdCliente");
//        q.setParameter(1, clienteManager.cercaClientePerId(idCliente));
//        if (!q.getResultList().isEmpty()) {
//
//            return null;
//        }
//        return q.getResultList();
        return null;
    }// cercaOrdinePerCliente

    @Override
    public void ordineSpedito(Ordine ordine) throws OrdineStateException {

        if (ordine == null) {

            throw new NullPointerException();
        } else if (ordine.getStato().equals(stato.confermato)) {

            ordine.setStato(stato.spedito);
            ordineFacade.edit(ordine);
        } else {

            throw new OrdineStateException();
        }
    }// ordineSpedito

    @Override
    public void ordineInElaborazione(Ordine ordine) throws OrdineStateException {

        if (ordine == null) {

            throw new NullPointerException();
        } else if (ordine.getStato().equals(stato.spedito) || ordine.getStato().equals(stato.confermato)) {

            throw new OrdineStateException();
        }
        ordine.setStato(stato.in_Elaborazione);
        ordineFacade.edit(ordine);
    }// ordineInElaborazione

    @Override
    public void ordineConfermato(Ordine ordine) throws OrdineStateException {

        if (ordine == null) {

            throw new NullPointerException();
        } else if (ordine.getStato().equals(stato.in_Elaborazione)) {

            ordine.setStato(stato.confermato);
            ordineFacade.edit(ordine);
        } else {

            throw new OrdineStateException();
        }
    }// ordineConfermato

    @Override
    public List<Ordine> cercaPerStatoNegozio(StatoOrdine stato, Long idNegozio) {

        if (idNegozio == null || stato == null) {

            throw new NullPointerException();
        }

        Query q = em.createNamedQuery("ordine.cercaPerStatoNegozio");
        q.setParameter(1, idNegozio);
        q.setParameter(2, stato);

        return q.getResultList();
    }// cercaPerStatoNegozio

    /**
     * Crea l'ordine e restituisce il suo id
     *
     * @param idNegozio
     * @return idOrdine
     */
    @Override
    public Long creaOrdine(Long idNegozio) {
        Ordine o = new Ordine();
        o.setNegozio(negozioFacade.find(idNegozio));
        o.setTotale(new Float(0.00));
        //Importantissimo!!!!!
        o.setStato(StatoOrdine.non_Confermato_Dal_Cliente);
        ordineFacade.create(o);
        return o.getId();
    }

    @Override
    public Ordine cercaPerId(Long idOrdine) {
        return ordineFacade.find(idOrdine);
    }

    @Override
    public void rimuoviOrdineDaId(Long idOrdine) {
        ordineFacade.remove(ordineFacade.find(idOrdine));
    }

    @Override
    public void modificaOrdine(Ordine ordine) {
        ordineFacade.edit(ordine);
    }

    @Override
    public Long getMaxOrdini(Long idCliente) {
        Query q=em.createNamedQuery("ordine.maxOrdini");
        q.setParameter(1, idCliente);
        List<Long> res=q.getResultList();
        int l=res.size();
        if(l==0){
            return 0L;
        }
        return res.get(l-1);
    }
}
